package com.android.support.lib.universal.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


import android.util.Log;

import com.android.support.lib.universal.base.BaseApplication;
import com.nostra13.universalimageloader.utils.StorageUtils;

public class Utilfile {
    /**
     * 获取文件
     *
     * @param path 文件完整路径，包括文件后缀名 （以path为主，当path为null时，dir和name才有效）
     * @param dir  文件目录,必须包含 android.os.Environment.getExternalStorageDirectory()
     *             .getAbsolutePath() + "/"+dir
     * @param name 文件名（包括后缀）
     * @return
     */
    public File getFile(String path, String dir, String name) {
        if (path == null) {
            StorageUtils.getOwnCacheDirectory(BaseApplication.getInstance(),
                    dir);
            File file = new File(dir, name);
            if (!file.exists()) {
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return file;
        }
        File file = new File(path);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return file;
    }

    /**
     * 读取某个文件夹下的所有文件
     *
     * @param filepath 文件夹路径
     * @param files    文件集合，可以为null.为null时，会自行创建集合。
     */
    public List<File> readfile(String filepath, List<File> files)
            throws FileNotFoundException, IOException {
        if (files == null) {
            files = new ArrayList<File>();
        }
        try {
            File file = new File(filepath);
            if (!file.isDirectory()) {
                files.add(file);
            } else if (file.isDirectory()) {
                String[] filelist = file.list();
                for (int i = 0; i < filelist.length; i++) {
                    File readfile = new File(filepath + "\\" + filelist[i]);
                    if (!readfile.isDirectory()) {
                        files.add(readfile);

                    } else if (readfile.isDirectory()) {
                        readfile(filepath + "\\" + filelist[i], files);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            Log.e("获取所有文件失败", "原因" + e.getMessage());
        }
        return files;
    }

    /**
     * 删除文件
     *
     * @param path 文件完整路径，包括文件后缀名 （以path为主，当path为null时，dir和name才有效）
     * @param dir  文件目录
     * @param name 文件名（包括后缀）
     */
    public void delFile(String path, String dir, String name) {
        try {
            if (path == null) {
                File file = new File(dir, name);
                if (file.exists()) {
                    file.delete();
                }
            } else {
                File file = new File(path);
                if (file.exists()) {
                    file.delete();
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            Log.e("文件删除异常", "异常信息" + e.getMessage());
        }

    }

    /**
     * 删除某个文件夹下的所有文件夹和文件
     *
     * @param delpath 文件夹路径
     */
    public boolean delAllFile(String delpath) throws FileNotFoundException,
            IOException {
        try {

            File file = new File(delpath);
            if (!file.isDirectory()) {
                file.delete();
            } else if (file.isDirectory()) {
                String[] filelist = file.list();
                for (int i = 0; i < filelist.length; i++) {
                    File delfile = new File(delpath + "\\" + filelist[i]);
                    if (!delfile.isDirectory()) {
                        delfile.delete();
                    } else if (delfile.isDirectory()) {
                        delAllFile(delpath + "\\" + filelist[i]);
                    }
                }
                file.delete();
            }

        } catch (FileNotFoundException e) {
            Log.e("删除所有文件异常", "原因" + e.getMessage());
        }
        return true;
    }

    /**
     * 获取文件名
     *
     * @param url 网络URL 或者 完整的文件名路径（包括后缀名）
     * @return
     */
    public String getFileName(String url) {
        if (new Utilregex().BUrl(url)) {
            String filename = url.substring(url.lastIndexOf('/') + 1);
            int index = filename.lastIndexOf("?");
            if (index != -1) {
                filename = filename.substring(0, index);
            }
            if (filename == null || "".equals(filename.trim())) {// 如果获取不到文件名称
                filename = UUID.randomUUID() + ".tmp";// 默认取一个文件名
            }
            return filename;
        }
        return new File(url).getName();

    }

    /**
     * 返回无后缀名的 文件名
     *
     * @param fileName 带后缀名的文件名。
     * @return
     */
    public String getName(String fileName) {
        int end = fileName.lastIndexOf(".");
        String name = fileName.substring(0, end);
        return name;
    }

    /**
     * 判断文件夹下是否文件名重复 true为重复
     *
     * @param filepath 文件夹路径
     * @param name     文件名（包括后缀）
     */
    public boolean isRepeat(String filepath, String name)
            throws FileNotFoundException, IOException {
        try {
            File file = new File(filepath);
            if (!file.isDirectory()) {
                /**
                 * file.getName() 获取文件名（包括后缀一并获取）
                 */
                if (name.equals(file.getName().toString().trim())) {
                    return true;
                }

            } else if (file.isDirectory()) {
                String[] filelist = file.list();
                for (int i = 0; i < filelist.length; i++) {
                    File readfile = new File(filepath + filelist[i]);
                    if (!readfile.isDirectory()) {

                        if (name.equals(readfile.getName().toString().trim())) {
                            return true;
                        }

                    } else if (readfile.isDirectory()) {
                        isRepeat(filepath + filelist[i], name);
                    }
                }

            }

        } catch (Exception e) {
        }
        return false;
    }

    /**
     * 重命名 true为命名成功，false失败
     *
     * @param filepath    文件夹路径
     * @param oldFileName 旧文件名(包括后缀名)
     * @param newFileName 新文件名(包括后缀名)
     */
    public boolean ReNameFile(String filepath, String oldFileName,
                              String newFileName) {
        // TODO Auto-generated method stub
        File target = new File(filepath + newFileName);
        if (target.exists()) { // 新文件若存在，则删掉
            target.delete();
        }
        File file = new File(filepath + oldFileName); // 旧文件
        boolean result = file.renameTo(target); // 将旧文件更名
        if (result) {
            return true;
        }
        return false;
//        else { // 更名失败，则采取变相的更名方法
//            try {
//                FileUtils.copyFile(file, target); // 将旧文件拷贝给新文件
//                // 清空旧文件
//                FileOutputStream out = null;
//                out = new FileOutputStream(file);
//                out.write(new byte[0]);
//                return true;
//            } catch (Exception e) {
//                return false;
//            }
//        }

    }

    /**
     * 获取文件大小
     *
     * @param path 文件的完整路径（文件名包括后缀名）
     * @return
     * @throws Exception
     */
    public String getFileSize(String path) throws Exception {
        long size = 0;
        File file = new File(path);
        if (file.exists()) {
            FileInputStream fis = null;
            fis = new FileInputStream(file);
            size = fis.available();
            fis.close();
            file = null;
        } else {
            file.createNewFile();
            file = null;
            Log.e("获取文件大小", "文件不存在!");
        }
        return new Utilnum().calculateSize(size);
    }
}
